package org.ehe.erp.mapper.finance;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.ehe.common.mybatis.core.mapper.BaseMapperPlus;
import org.ehe.erp.domain.finance.ErpFinancePayment;
import org.ehe.erp.domain.finance.vo.ErpFinancePaymentVo;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * @author :zhangnn
 * @className :ErpFinancePaymenMpper
 * @description: TODO
 * @date 2025-08-18 14:28:11
 */
public interface ErpFinancePaymentMapper extends BaseMapperPlus<ErpFinancePayment, ErpFinancePaymentVo> {
    /**
     * 查询付款单详情（包含关联信息）
     *
     * @param id 付款单ID
     * @return ErpFinancePaymentVo
     */

    ErpFinancePaymentVo selectDetailById(@Param("id") Long id);

    /**
     * 分页查询付款单列表（包含关联信息）
     *
     * @param page    分页参数
     * @param wrapper 查询条件
     * @return IPage<ErpFinancePaymentVo>
     */

    IPage<ErpFinancePaymentVo> selectPageWithDetails(Page<?> page, @Param("ew") Wrapper<ErpFinancePayment> wrapper);

    /**
     * 查询付款单列表（包含关联信息）
     *
     * @param wrapper 查询条件
     * @return List<ErpFinancePaymentVo>
     */
    List<ErpFinancePaymentVo> selectListWithDetails(@Param("ew") Wrapper<ErpFinancePayment> wrapper);

    /**
     * 统计指定时间范围内的付款金额
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param status    状态（可选）
     * @return 付款总金额
     */

    BigDecimal sumPaymentAmountByTimeRange(@Param("startTime") LocalDateTime startTime,
                                           @Param("endTime") LocalDateTime endTime,
                                           @Param("status") Integer status);

    /**
     * 统计供应商的付款金额
     *
     * @param supplierId 供应商ID
     * @param startTime  开始时间（可选）
     * @param endTime    结束时间（可选）
     * @return 付款总金额
     */
    BigDecimal sumPaymentAmountBySupplier(@Param("supplierId") Long supplierId,
                                          @Param("startTime") LocalDateTime startTime,
                                          @Param("endTime") LocalDateTime endTime);

    /**
     * 根据付款单号查询付款单
     *
     * @param no 付款单号
     * @return ErpFinancePayment
     */
    ErpFinancePayment selectByNo(@Param("no") String no);

    /**
     * 查询指定账户的付款记录
     *
     * @param accountId 账户ID
     * @param limit     限制条数
     * @return List<ErpFinancePaymentVo>
     */
    List<ErpFinancePaymentVo> selectRecentByAccount(@Param("accountId") Long accountId, @Param("limit") int limit);

    /**
     * 查询待审核的付款单数量
     *
     * @return 待审核数量
     */
    Long countPendingAudit();

    /**
     * 查询今日付款金额
     *
     * @return 今日付款总金额
     */
    BigDecimal getTodayPaymentAmount();

    /**
     * 查询本月付款金额
     *
     * @return 本月付款总金额
     */
    BigDecimal getMonthPaymentAmount();

    List<ErpFinancePayment> selectByPayableId(Long payableId);
}
